Внутреннее устройство проекта
Когда приступаешь к работе над чужим кодом - главное быстро разобраться, где что находится. Давайте попробуем это сделать.
Откроем в Visual Studio файл 1Script.sln и посмотрим на структуру проекта.
Солюшен содержит несколько сборок:
Сборка | Описание сборки |
---|---|
oscript | Консольное exe-приложение, выполняющее сценарии в командной строке |
ScriptEngine | Ядро движка. Определяет базовые возможности языковых средств. Содержит компилятор и виртуальную машину |
ScriptEngine.HostedScript | Библиотека, обеспечивающая подключение скриптового движка к исполняющим приложениям (exe). Эта библиотека содержит все прикладные классы (Коллекции, Xml и прочее). |
ScriptEngine.Snegopat | Обеспечивает интеграцию с проектом "Снегопат" |
TestApp | Тестовое приложение с графическим интерфейсом. Позволяет писать несложные скрипты и выполнять эксперименты по изучению движка |
Как правило, расширение и развитие функционала должно реализовываться в библиотеке ScriptEngine.HostedScript.dll. Именно там содержатся все классы стандартной библиотеки и именно там нужно добавлять новые классы.
Терминология
Термин | Описание |
---|---|
Компилятор | Совокупность объектов, выполняющих трансляцию языка 1С в байт-код скрипта |
Виртуальная машина | Объект, непосредственно выполняющий байт-код скрипта. ВМ реализована в классе MachineInstance |
Программное окружение | Набор всех классов, переменных и функций, видимых из языка. Это набор всех языковых средств, которые может использовать разработчик скрипта. |
Контекст | элемент программного окружения. Собственно, программное окружение представляет собой набор контекстов, подключенных к виртуальной машине. Все классы, доступные из языка, представляют собой контексты. |
Глобальный контекст | контекст, который подключен в глобальную область видимости. В результате все его свойства и методы доступны в скрипте как глобальные. Например, если контекст "Массив" подключить в глобальную область видимости, то глобально будут доступны функции Добавить(), Количество() и Получить(). Глобальный контекст реализован именно как класс. Это обычный класс, но он подключен в глобальную область видимости, за счет чего все его свойства и методы в скрипте видны как глобальные. |
Базовые понятия
IValue - универсальное значение
Каждое значение представлено типом IValue. Поскольку язык 1С слабо типизирован, то IValue может хранить любое значение. Все числа, строки, объекты, все это - экземпляры IValue.
Интерфейс IValue имеет несколько методов, позволяющих "добыть" из него конкретное значение:
- Функция AsString - приводит объект к строке и возвращает ее. Как правило, результат функции аналогичен стандартной ф-ии ToString(), но не обязательно.
- Функция AsNumber - приводит объект к типу decimal, т.е. получает тип Число. Если это невозможно, выбрасывается исключение "Приведение к типу Число невозможно"
- Функции AsDate/AsBoolean выполняют аналогичные приведения значений
- Функция AsObject приводит значение к объектному типу. Выбрасывает исключение "Значение не является значением объектного типа", если тип не является объектом.
IRuntimeContextInstance - базовый объектный тип
Все объекты представлены экземплярами типа IRuntimeContextInstance. Этот тип является самым базовым для любых объектов.
Именно этот интерфейс используется для вызова свойств и методов объектов внутри виртуальной машины. Функция IValue.AsObject() возвращает как раз IRuntimeContextInstance.
IVariable - просто переменная
Переменная хранит внутри какой-то IValue. Вне виртуальной машины IVariable позволяет организовать возврат значения через параметр (выходной параметр метода). об этом позже
Как добавить что-либо в проект
Нужно взять одну из задач (или создать свою собственную задачу) со страницы Issues и реализовать ее. Для реализации задачи нужно будет завести отдельную ветку в GIT, а когда задача будет решена - прислать pull request.
Если возникают вопросы по разработке - не стесняйтесь спрашивать прямо в комментариях к выбранной Issue или черезличные сообщения в BitBucket.